#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 在文件头部添加正则模块导入
import re
import os
import sys
import json
import ctypes
import winreg
import platform
import subprocess
from glob import glob
from shutil import rmtree

def get_admin():
    if ctypes.windll.shell32.IsUserAnAdmin() == 0:
        ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
        sys.exit()

def kill_browsers():
    browsers = ['360se.exe', '360chrome.exe', '360loader.exe']
    for browser in browsers:
        subprocess.call(f'taskkill /F /IM {browser}', shell=True)

def get_360_versions():
    versions = []
    try:
        reg_paths = [
            r"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall",
            r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
            r"SOFTWARE\360Safe\Browser",
            r"SOFTWARE\360Chrome",
            r"SOFTWARE\360\360Safe",
            r"SOFTWARE\Wow6432Node\360Safe\Browser",
            r"SOFTWARE\360\360se",
            r"SOFTWARE\360Browser",
            # 新增国际版注册表路径
            r"SOFTWARE\360\360seInternational",
            # 新增更多变种路径
            r"SOFTWARE\Wow6432Node\360\360se",
            r"SOFTWARE\360\360se6",
            # 新增Windows 11特有路径
            r"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\360se.exe",
            r"Software\360\360se6",  # 新增360se6专用路径
            r"Software\360Safe\Browser",
            r"SOFTWARE\Clients\StartMenuInternet\360se6",  # 添加开始菜单项路径
            r"SOFTWARE\Clients\StartMenuInternet\360Browser",
            # 新增文件关联注册表路径
            r"SOFTWARE\Classes\360seHTML",
            r"SOFTWARE\Clients\StartMenuInternet\360Browser\shell\open\command",
            # 新增用户级安装信息和协议关联
            r"Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice",
            r"Software\360\360se6\Update"
        ]  # 修复列表闭合

        # 正确的注册表扫描代码（原错误代码被移除）
        for path in reg_paths:
            try:
                is_wow64 = 'WOW6432Node' in path.upper()
                access = winreg.KEY_READ | (winreg.KEY_WOW64_32KEY if is_wow64 else winreg.KEY_WOW64_64KEY)
                key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path, 0, access)
                
                for i in range(0, winreg.QueryInfoKey(key)[0]):
                    subkey_name = winreg.EnumKey(key, i)
                    with winreg.OpenKey(key, subkey_name) as subkey:
                        try:
                            name = winreg.QueryValueEx(subkey, "DisplayName")[0]
                            if re.search(r'360.*(浏览器|Browser)', name, re.IGNORECASE):
                                version = winreg.QueryValueEx(subkey, "DisplayVersion")[0]
                                try:
                                    install_path = winreg.QueryValueEx(subkey, "InstallLocation")[0]
                                except FileNotFoundError:
                                    install_path = "路径未记录"
                                print(f"[DEBUG] 发现潜在浏览器注册表项: {name} v{version} 路径:{install_path}")
                                versions.append((name, version, install_path))
                        except WindowsError:
                            continue
            except Exception as e:
                if '系统找不到指定的文件' not in str(e) and '拒绝访问' not in str(e):
                    print(f"注册表路径 {path} 访问错误: {str(e)}")
    except Exception as e:
        print(f"注册表读取错误: {str(e)}")
        if not versions:
            print("[DEBUG] 注册表扫描完成，未发现有效浏览器注册表项")
    return versions

def main():
    get_admin()
    
    print(f"系统版本: {platform.system()} {platform.release()}")
    versions = get_360_versions()
    
    # 初始化验证结果列表
    valid_versions = []  # 将定义移到此处
    
    # 将 default_paths 定义移到循环外部（修复作用域问题）
    default_paths = [
        # 1. 用户级安装路径检测（新增的精确路径）
        os.path.normpath(os.path.join(os.environ['APPDATA'], '360se6', 'Application')),
        # 2. 系统默认路径检测
        os.environ.get('ProgramFiles', r'C:\Program Files'),
        # 3. 常见便携版路径检测（使用集合去重后的路径）
        os.path.expandvars(r'%USERPROFILE%\AppData\Roaming\360se6'),
        # 4. 历史版本残留路径检测
        os.path.normpath(os.path.expandvars(r'%LOCALAPPDATA%\360Chrome')),
        # 新增便携版可执行文件验证
        os.path.normpath(os.path.expandvars(r'%USERPROFILE%\Desktop\360安全浏览器\360se.exe'))
    ]

    # 在深度验证中添加便携版特征检测
    for base_path in default_paths:
        # 新增便携版目录特征检测
        portable_pattern = re.compile(r'360(安全|极速)?浏览器[\\]?')
        if portable_pattern.search(base_path):
            print(f"[DEBUG] 发现便携版路径: {base_path}")
            valid_versions.append(("360安全浏览器(便携版)", "未知版本", base_path))  # 新增验证结果
            
        # 新增可执行文件存在性检查
        exe_files = glob(os.path.join(base_path, '*.exe'))
        browser_exes = [f for f in exe_files if '360se' in f.lower() or '360chrome' in f.lower()]
        if browser_exes:
            print(f"[DEBUG] 发现浏览器可执行文件: {browser_exes}")
            valid_versions.append(("360安全浏览器(绿色版)", "便携版", os.path.dirname(browser_exes[0])))  # 新增验证结果

    # 步骤3：深度验证（新增的三级验证）
    for base_path in default_paths:
        # 1. 目录特征匹配（正则表达式匹配）
        # 2. 可执行文件验证（360se.exe/360se6.exe）
        # 3. 配置文件存在性检查（User Data目录）
        appdata_paths = [
            os.environ['APPDATA'],
            os.path.join(os.environ['APPDATA'], '360se6'),
            os.path.join(os.environ['APPDATA'], '360se6', 'Application', 'User Data'),
            os.path.join(os.environ['LOCALAPPDATA'], '360Chrome', 'Chrome', 'User Data'),
            # 新增标准版浏览器配置路径
            os.path.join(os.environ['LOCALAPPDATA'], '360Chrome', 'User Data'),
            os.path.join(os.environ['APPDATA'], '360se', 'User Data')
        ]

        # 修改为递归搜索所有用户配置目录
        user_dirs = []
        for path in appdata_paths:
            found = glob(os.path.join(path, '**', 'User Data*'), recursive=True)
            # 新增路径规范化去重
            user_dirs += [os.path.normpath(p) for p in found]
        
        # 新增去重处理
        user_dirs = list(set(user_dirs))  # 使用集合去重
        print(f"[DEBUG] 发现用户数据目录: {user_dirs}")  # 添加调试日志

        for profile in user_dirs:
            # 扩展配置文件路径检测
            prefs_paths = [
                os.path.join(profile, 'Default', 'Preferences'),
                os.path.join(profile, 'Profile 1', 'Preferences'),
                # 修改为仅处理Login Data文件（避免重复）
                os.path.join(profile, 'Login Data')
            ]
            
            for prefs_path in prefs_paths:
                if os.path.exists(prefs_path):
                    try:
                        with open(prefs_path, 'r+', encoding='utf-8') as f:
                            prefs = json.load(f)
                            # 禁用密码保存和提示功能
                            prefs.setdefault('profile', {}).update({
                                'password_manager_enabled': False,
                                'credentials_enable_service': False,
                                'prompt_for_saving_passwords': False
                            })
                            f.seek(0)
                            json.dump(prefs, f)
                            f.truncate()
                            print(f"[SUCCESS] 已禁用密码保存功能: {prefs_path}")  # 添加成功提示
                    except Exception as e:
                        print(f"配置文件修改失败: {prefs_path} - {str(e)}")
    
        # 清除保存的密码（保持不变）
        login_data = os.path.join(profile, 'Default', 'Login Data')
        if os.path.exists(login_data):
            try:
                os.remove(login_data)
            except Exception as e:
                print(f"密码记录删除失败: {login_data} - {str(e)}")

    # 步骤4：多维度结果判断
    if not valid_versions:
        print("""\
未检测到的可能原因：
1. 注册表项被清理（但文件残留）
2. 绿色版/便携版浏览器
3. 自定义安装路径未包含在检测范围""")  # 移除首行换行并闭合三引号

if __name__ == "__main__":
    main()